home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
os30
/
gfx
/
animdemo.lha
/
ilbm.asm
< prev
next >
Wrap
Assembly Source File
|
1993-01-22
|
5KB
|
226 lines
*******************************************************************************
*
* (c) Copyright 1993 Commodore-Amiga, Inc. All rights reserved.
*
* This software is provided as-is and is subject to change; no warranties
* are made. All use is at your own risk. No liability or responsibility
* is assumed.
*
* ilbm.asm - code to decode ILBMs and LONG DLTAs.
* This code has some 68020 optimisations, and the DLTA code has some
* optimisations best suited for my animation (namely, changing the order in
* which the DLTA opcodes are checked).
*
*******************************************************************************
incdir 'include:'
include 'intuition/screens.i'
include 'graphics/rastport.i'
include 'graphics/gfx.i'
include "playanim.i"
opt p=68020
* void __asm ShowILBM(register __a0 struct BitMapHeader *bmhd, register __a1 struct BitMap *bm, register __a2 UBYTE *buff);
xdef _ShowILBM
_ShowILBM:
movem.l a2-a6/d2-d7,-(sp)
lea bm_Planes(a1),a3
moveq #0,d2
move.l d2,d7
move.l d2,d3
move.w bm_BytesPerRow(a1),d2
move.b bmhd_nplanes(a0),d7
subq.b #1,d7
move.w bmhd_h(a0),d6
move.w bmhd_w(a0),d5
add.w #15,d5
asr.w #4,d5
add.w d5,d5 ; bytes per row in the image
move.w d7,d4
bra.s do_rows.
do_rows:
move.l a3,a4 ; restore plane pointers
next_plane:
sub.l a5,a5
move.l (a4)+,a0 ; plane pointer
adda.l d3,a0 ; to next row
next_col:
move.b (a2)+,d0 ; next byte in the buffer
bpl.s do_copy
neg.b d0 ; repeat the next byte d0 times
ext.w d0
bmi.s next_col ; was 128 == NOP
add.w d0,a5
addq.w #1,a5
move.b (a2)+,d1
1$:
move.b d1,(a0)+
dbra.s d0,1$
check_col:
cmp.w a5,d5
bne.s next_col
dbra.s d4,next_plane
move.w d7,d4 ; restore plane counter
add.l d2,d3 ; next row in the bitmap
do_rows.:
dbra.s d6,do_rows
ShowILBM.:
movem.l (sp)+,d2-d7/a2-a6
rts
do_copy:
ext.w d0
addq.b #1,d0
add.w d0,a5
move.w d0,a6
asr.w #2,d0 ; how many longwords?
bra.s copy_l.
copy_l:
move.l (a2)+,(a0)+
copy_l.:
dbra.s d0,copy_l
move.w a6,d0
and.w #$3,d0 ; this many bytes left over
bra.s copy_b.
copy_b:
move.b (a2)+,(a0)+
copy_b.:
dbra.s d0,copy_b
bra.s check_col
* void __asm PlayDLTA(register __a2 struct BitMap *bm, register __a1 UBYTE *buff, register __a3 WORD *table, register __d4 UWORD ImageWidth, register __d5 UWORD ImageDepth);
xdef _PlayDLTA
_PlayDLTA:
movem.l a2/a5-a6/d2-d7,-(sp)
move.l a1,a5
asr.w #2,d4 ; /4 for the LONG compression
moveq #0,d3
move.w bm_BytesPerRow(a2),d2
lea bm_Planes(a2),a6
bra.s loop.
loop:
move.l (a6)+,a2 ; next bitplane OUT
move.l a5,a0
add.l 0(a5,d3),a0 ; next plane IN
addq.w #4,d3
bsr.s _DecodeVKPlane
loop.:
dbra.s d5,loop
movem.l (sp)+,a2/a5-a6/d2-d7
rts
; LONG ASM DecodeVKPlane (REG (a0) char *in, REG(a2) char *out, REG (d2) LONG BytesPerRow, REG (a3) WORD *ytable, REG (d4) xcount);
_DecodeVKPlane:
movem.l a2/a3/d2-d5,-(sp) ; save registers
moveq #7,d6
move.l #$7fffffff,d7
bra zdcp ; And go to the "columns" loop
dcp
move.l a2,a1 ; get copy of dest pointer
move.l (a0)+,d0 ; fetch number of ops in this column
bra zdcvclp ; and branch to the "op" loop.
dcvclp:
move.l (a0)+,d1 ; fetch next op
bmi dcvskuniq ; if hi-bit set branch to "uniq" decoder
bne skip ; if op is >0, then it's a "skip"
dcvsame ; here we decode a "vertical same run"
move.l (a0)+,d1 ; fetch the count
move.l (a0)+,d3 ; fetch the value to repeat
move.w d1,d5 ; and do what it takes to fall into a "tower"
lsr.w #3,d5 ; d5 holds # of times to loop through tower
and.w d6,d1 ; d1 is the remainder
add.w d1,d1
add.w d1,d1
neg.w d1
jmp 32+same_tower(pc,d1.w)
same_tower
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
move.l d3,(a1)
adda.w d2,a1
dbra d5,same_tower
dbra d0,dcvclp
addq.l #4,a2
dbra d4,dcp
movem.l (sp)+,a2/a3/d2-d5
rts
skip ; otherwise it's just a skip
* ; use amount to skip as index into word-table
adda.w (0,a3,d1.w*2),a1
dbra d0,dcvclp ; go back to top of op loop
addq.l #4,a2
dbra d4,dcp
movem.l (sp)+,a2/a3/d2-d5
rts
dcvskuniq ; here we decode a "unique" run
and.l d7,d1 ; setting up a tower as above....
move.w d1,d5
lsr.w #3,d5
and.w d6,d1
add.w d1,d1
add.w d1,d1
neg.w d1
jmp 32+uniq_tower(pc,d1.w)
uniq_tower
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
move.l (a0)+,(a1)
adda.w d2,a1
dbra d5,uniq_tower ; branch back up to "op" loop
zdcvclp dbra d0,dcvclp ; branch back up to "column loop"
; now we've finished decoding a single column
z1dcp addq.l #4,a2 ; so move the dest pointer to next column
zdcp dbra d4,dcp ; and go do it again what say?
movem.l (sp)+,a2/a3/d2-d5 ; restore registers
rts